﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace Dycox.Workflows
{
    public abstract class SupportAppData
    {
        private object _appData;

        public object AppData
        {
            get
            {
                if (_appData == null && AppDataStore != null)
                {
                    _appData = JsonConvert.DeserializeObject(AppDataStore, CreateSerializerSettings());

                    if (_appData is INotifyPropertyChanged)
                        ((INotifyPropertyChanged)_appData).PropertyChanged += _appData_PropertyChanged;
                }
                return _appData;
            }
            set
            {
                if (value != _appData)
                {
                    INotifyPropertyChanged npc = _appData as INotifyPropertyChanged;
                    if (npc != null)
                        npc.PropertyChanged -= _appData_PropertyChanged;

                    _appData = value;

                    npc = _appData as INotifyPropertyChanged;
                    if (npc != null)
                        npc.PropertyChanged += _appData_PropertyChanged;

                    SerializeAppData();
                }
            }
        }

        private JsonSerializerSettings CreateSerializerSettings()
        {
            JsonSerializerSettings jss = new JsonSerializerSettings();
            jss.TypeNameHandling = TypeNameHandling.Objects;
            jss.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            return jss;
        }

        private void SerializeAppData()
        {
            if (_appData != null)
            {

                string json = JsonConvert.SerializeObject(_appData, CreateSerializerSettings());
                AppDataStore = json;
            }
            else
                AppDataStore = null;
        }

        void _appData_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            SerializeAppData();
        }

        protected abstract string AppDataStore { get; set; }
    }
}
